package thread;

/**
 * demo07
 * 生产者 消费者问题
 * 信号灯法解决
 *
 * @author dingwen
 * @date 2021/09/08
 */
public class Demo07 {
    public static void main(String[] args) {
        Television television = new Television();
        new Thread(new Player(television)).start();
        new Thread(new Watcher(television)).start();
    }
}


/**
 * 电视节目
 *
 * @author dingwen
 * @date 2021/09/08
 */
class Television {
    /**
     * 节目名称
     */
    String name;

    /**
     * 标志位 已有节目可以观看
     */
    boolean flag = true;


    /**
     * 演员表演
     *
     * @param name name
     */
    public synchronized void play(String name) {
        if (!flag) {
            // 已经有节目了演员等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 没有节目，演员表演
        System.out.println("演员表演了" + name + "节目");
        // 通知观众观看
        this.notifyAll();
        this.name = name;
        this.flag = !this.flag;
    }


    public synchronized void watch() {
        if (flag) {
            // 没有节目 观众等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        // 已经有节目，观众观看
        System.out.println("观众观看了" + name + "节目");
        // 通知演员表演
        this.notifyAll();
        this.flag = !this.flag;
    }

}


/**
 * 生产者 演员
 *
 * @author dingwen
 * @date 2021/09/08
 */
class Player implements Runnable{

    /**
     * 电视节目
     */
    public Television television;

    public Player(Television television) {
        this.television = television;
    }

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            television.play("快乐大本营");
        }
    }
}


class Watcher implements Runnable{

    /**
     * 电视节目
     */
    public Television television;

    public Watcher(Television television) {
        this.television = television;
    }

    @Override
    public void run() {
        for (int i = 10; i > 0; i--) {
            television.watch();
        }
    }
}
